{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\n# SVM Tie Breaking Example\n\nTie breaking is costly if ``decision_function_shape='ovr'``, and therefore it\nis not enabled by default. This example illustrates the effect of the\n``break_ties`` parameter for a multiclass classification problem and\n``decision_function_shape='ovr'``.\n\nThe two plots differ only in the area in the middle where the classes are\ntied. If ``break_ties=False``, all input in that area would be classified as\none class, whereas if ``break_ties=True``, the tie-breaking mechanism will\ncreate a non-convex decision boundary in that area.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "print(__doc__)\n\n\n# Code source: Andreas Mueller, Adrin Jalali\n# License: BSD 3 clause\n\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom sklearn.svm import SVC\nfrom sklearn.datasets import make_blobs\n\nX, y = make_blobs(random_state=27)\n\nfig, sub = plt.subplots(2, 1, figsize=(5, 8))\ntitles = (\"break_ties = False\",\n          \"break_ties = True\")\n\nfor break_ties, title, ax in zip((False, True), titles, sub.flatten()):\n\n    svm = SVC(kernel=\"linear\", C=1, break_ties=break_ties,\n              decision_function_shape='ovr').fit(X, y)\n\n    xlim = [X[:, 0].min(), X[:, 0].max()]\n    ylim = [X[:, 1].min(), X[:, 1].max()]\n\n    xs = np.linspace(xlim[0], xlim[1], 1000)\n    ys = np.linspace(ylim[0], ylim[1], 1000)\n    xx, yy = np.meshgrid(xs, ys)\n\n    pred = svm.predict(np.c_[xx.ravel(), yy.ravel()])\n\n    colors = [plt.cm.Accent(i) for i in [0, 4, 7]]\n\n    points = ax.scatter(X[:, 0], X[:, 1], c=y, cmap=\"Accent\")\n    classes = [(0, 1), (0, 2), (1, 2)]\n    line = np.linspace(X[:, 1].min() - 5, X[:, 1].max() + 5)\n    ax.imshow(-pred.reshape(xx.shape), cmap=\"Accent\", alpha=.2,\n              extent=(xlim[0], xlim[1], ylim[1], ylim[0]))\n\n    for coef, intercept, col in zip(svm.coef_, svm.intercept_, classes):\n        line2 = -(line * coef[1] + intercept) / coef[0]\n        ax.plot(line2, line, \"-\", c=colors[col[0]])\n        ax.plot(line2, line, \"--\", c=colors[col[1]])\n    ax.set_xlim(xlim)\n    ax.set_ylim(ylim)\n    ax.set_title(title)\n    ax.set_aspect(\"equal\")\n\nplt.show()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.6.9"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}